òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/13848

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

import talib
from prettytable import PrettyTable 
import pandas 
import datetime
import time
from jqdata import *

def initialize(context):
    set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    set_option('use_real_price', True)
    set_benchmark('000300.XSHG')
    log.set_level('order', 'error')
    log.set_level('history', 'error')
    g.buy_stock_count = 1
    g.hour = 9
    g.minute = 30
    
def handle_data(context, data):
    hour = context.current_dt.hour
    minute = context.current_dt.minute
    buy_stocks = []
    if hour == g.hour and minute == g.minute:
        buy_stocks = select_stocks(context,data)
        print 'ǰһոʣʽ𣩾ߵĹƱ\n'
        for stock in buy_stocks:
            print show_stock(stock)
        adjust_position(context, buy_stocks)
        print get_portfolio_info_text(context,buy_stocks)
        
def select_stocks(context,data):
    date = context.current_dt.strftime("%Y-%m-%d")
    today = datetime.datetime.strptime(date, "%Y-%m-%d").date()
    yesterday = shifttradingday(today ,shift = -1)
    print 'ǰһ:',yesterday 
    q = query(finance.STK_EL_TOP_ACTIVATE).filter(finance.STK_EL_TOP_ACTIVATE.day == yesterday )
    df = finance.run_query(q)
    df['net'] = df.buy - df.sell
    df = df.sort(columns = ['net'] , axis = 0, ascending = False)
    df = df[(df.link_id != 310003 ) & (df.link_id != 310004 )]
    stock_list = list(df['code'])
    # ˵ͣƵĺST
    #stock_list = filter_paused_and_st_stock(stock_list)
    #˵ҵ
    #stock_list = filter_gem_stock(context, stock_list)
    # ˵г1
    #stock_list = filter_old_stock(context, stock_list)
    # ˵ͣߵͣ
    #stock_list = filter_limit_stock(context, stock_list)
    #stock_list = filter_limit_stock(context, data, stock_list)
    #ѡȡǰNֻƱ롰ĿƱء
    stock_list = stock_list[:g.buy_stock_count]  
    return stock_list
        
def filter_paused_and_st_stock(stock_list):
    current_data = get_current_data()
    return [stock for stock in stock_list if not current_data[stock].paused 
    and not current_data[stock].is_st and 'ST' not in current_data[stock].
    name and '*' not in current_data[stock].name and '' not in current_data[stock].name]
    
def filter_gem_stock(context, stock_list):
    return [stock for stock in stock_list  if stock[0:3] != '300']

def filter_old_stock(context, stock_list):
    tmpList = []
    for stock in stock_list :
        days_public=(context.current_dt.date() - get_security_info(stock).start_date).days
        # δ1
        if  days_public < 365 :
            tmpList.append(stock)
    return tmpList
    
def filter_limit_stock(context, data, stock_list):
    tmpList = []
    current_data = get_current_data()
    for stock in stock_list:
        # δͣҲδͣ
        if (data[stock].low_limit < data[stock].close < data[stock].high_limit) and (current_data[stock].low_limit < data[stock].close < current_data[stock].high_limit):
            tmpList.append(stock)
    return tmpList
    
def adjust_position(context, buy_stocks):
    # ֲֳֵĹƱڡĿءУδͣ
    if len(context.portfolio.positions)>0:
        last_prices = history(1, '1m', 'close', security_list=context.portfolio.positions.keys())
        for stock in context.portfolio.positions.keys():
            if stock not in buy_stocks :
                curr_data = get_current_data()
                if last_prices[stock][-1] < curr_data[stock].high_limit:
                    order_target_value(stock, 0)
    # 롰ĿءеĹƱ            
    for stock in buy_stocks:
        position_count = len(context.portfolio.positions)
        if g.buy_stock_count > position_count:
            value = context.portfolio.cash / (g.buy_stock_count - position_count)
            if context.portfolio.positions[stock].total_amount == 0:
                order_target_value(stock, value)
                
def shifttradingday(date,shift):
    #ȡNǰĽ
    # ȡеĽգһнյ list,ԪֵΪ datetime.date .
    tradingday = get_all_trade_days()
    # õdate֮shiftһбеб һ
    shiftday_index = list(tradingday).index(date)+shift
    # кŷظ Ϊdatetime.date
    return tradingday[shiftday_index]

def show_stock(stock):
    '''
    ȡƱʾϢ    
    :param stock: Ʊ룬: '603822.SH'
    :return: str磺'603822 ΰĻ'
    '''
    return u"%s %s" % (stock[:6], get_security_info(stock).display_name)
    
def get_portfolio_info_text(context,new_stocks,op_sfs=[0]):
    # new_stocksҪֲֵĹƱб
    sub_str = ''
    table = PrettyTable(["ֺ","Ʊ", "ֲ", "ǰ", "ӯ","ֱֲ"])  
    for sf_id in range(len(context.subportfolios)):
        cash = context.subportfolios[sf_id].cash
        p_value = context.subportfolios[sf_id].positions_value
        total_values = p_value +cash
        if sf_id in op_sfs:
            sf_id_str = str(sf_id) + ' *'
        else:
            sf_id_str = str(sf_id)
        for stock in context.subportfolios[sf_id].long_positions.keys():
            position = context.subportfolios[sf_id].long_positions[stock]
            if sf_id in op_sfs and stock in new_stocks:
                stock_str = show_stock(stock) + ' *'
            else:
                stock_str = show_stock(stock)
            stock_raite = (position.total_amount * position.price) / total_values * 100
            table.add_row([sf_id_str,
                stock_str,
                position.total_amount,
                position.price,
                "%.2f%%"%((position.price - position.avg_cost) / position.avg_cost * 100), 
                "%.2f%%"%(stock_raite)]
                )
        if sf_id < len(context.subportfolios) - 1:
            table.add_row(['----','---------------','-----','----','-----','-----'])
        sub_str += '[ֺ: %d] [ֵ:%d] [ֹ:%d] [λ:%.2f%%] \n'%(sf_id,
            total_values,
            len(context.subportfolios[sf_id].long_positions)
            ,p_value*100/(cash+p_value))
    print 'Ӳ:\n' + sub_str + str(table)
